// Package rfile 提供文件操作相关的工具函数，
// 包含文件写入、目录处理等功能，简化文件操作流程。
package rfile

import (
	"gameServer/utils/rpath" // 导入路径处理工具包，用于判断目录是否存在
	"io/fs"                  // 用于文件权限模式的定义
	"os"                     // 提供操作系统级别的文件操作接口
	"path/filepath"          // 提供跨平台的文件路径处理函数
)

// WriteFile 向指定文件路径写入内容，若文件所在目录不存在则自动创建
// 参数：
//
//	filesource: 目标文件的完整路径（包含文件名，例如 "data/config/settings.json"）
//	content: 要写入文件的字节内容（如字符串转换的字节切片、二进制数据等）
//
// 返回值：
//
//	error: 操作成功时返回 nil，失败时返回具体错误（如创建目录失败、写入权限不足等）
//
// 功能说明：
//  1. 解析目标文件路径中的目录部分（例如将 "data/config/settings.json" 解析为 "data/config"）
//  2. 检查该目录是否存在（通过 rpath.IsDir 工具函数判断）
//  3. 若目录不存在，调用 os.MkdirAll 递归创建所有不存在的父目录，权限设为 os.ModePerm（0777，实际权限受系统 umask 影响）
//  4. 向目标文件路径写入内容，文件权限设为 fs.ModePerm（0666，实际权限受系统 umask 影响）
//
// 注意：
//   - 若文件已存在，会覆盖原有内容（os.WriteFile 的默认行为）
//   - 目录和文件的实际权限可能因操作系统的安全策略而被降低（如 Linux 下 umask 通常会去除组和其他用户的写权限）
func WriteFile(file string, content []byte) error {
	// 提取文件路径中的目录部分（不含文件名）
	path := filepath.Dir(file)

	// 检查目录是否存在，若不存在则创建
	if !rpath.IsDir(path) {
		// 递归创建目录（包括所有不存在的中间目录），权限为最大权限
		err := os.MkdirAll(path, os.ModePerm)
		if err != nil {
			return err // 创建目录失败时，返回错误
		}
	}

	// 向目标文件写入内容，文件权限为最大权限
	return os.WriteFile(file, content, fs.ModePerm)
}
